﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using AcademiaEntidades;

namespace AcademiaDAO
{
    public class CursoDAO
    {
        public static List<Curso> obtenerCursos()
        {
            List<Curso> listaCurso = new List<Curso>();

            SqlConnection cn = null;
            try
            {
                cn = AccesoDato.dameConexion();
                cn.Open();
                SqlCommand cmd = new SqlCommand();
                string sql = @"select Top 1000 * from Curso";
                cmd.CommandText = sql;
                cmd.Connection = cn;
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    Curso curso = new Curso();
                    curso.IdCurso = int.Parse(dr["IdCurso"].ToString());
                    curso.IdNivelCurso = int.Parse(dr["IdNivelCurso"].ToString());
                    curso.Nombre = dr["Nombre"].ToString();
                    curso.NumeroAula = int.Parse(dr["NumeroAula"].ToString());
                    curso.Precio = decimal.Parse(dr["Precio"].ToString());
                    curso.IdProfesor = int.Parse(dr["IdProfesor"].ToString());
                    listaCurso.Add(curso);
                    curso = null;
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw new Exception("No se pudieron obtener los datos del Curso");//El metodo que lo invoque debera tratar la exepcion
            }
            finally//Si la conexion se pudo abrir hay que cerrarla
            {
                if (cn.State == ConnectionState.Open)
                    cn.Close();
            }
            return listaCurso;
        }//Fin del metodo obtenerCursos
        public static List<Horario> obtenerHorarios()
        {
            List<Horario> listaHorario = new List<Horario>();

            SqlConnection cn = null;
            try
            {
                cn = AccesoDato.dameConexion();
                cn.Open();
                SqlCommand cmd = new SqlCommand();
                string sql = @"select Top 1000 * from Horario";
                cmd.CommandText = sql;
                cmd.Connection = cn;
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    Horario horario = new Horario();
                    horario.IdHorario = int.Parse(dr["IdHorario"].ToString());
                    horario.HoraInicio = TimeSpan.Parse(dr["HoraInicio"].ToString());
                    horario.HoraFin = (TimeSpan)dr["HoraFin"];
                    horario.Dia = dr["Dia"].ToString();
                    listaHorario.Add(horario);
                    horario = null;
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw new Exception("No se pudieron obtener los datos de los Horarios");//El metodo que lo invoque debera tratar la exepcion
            }
            finally//Si la conexion se pudo abrir hay que cerrarla
            {
                if (cn.State == ConnectionState.Open)
                    cn.Close();
            }
            return listaHorario;
        }//Fin del metodo obtenerHorarios
        public static Horario obtenerHorarioXId(int idHorario)
        {
            Horario horario = new Horario();
            SqlConnection cn = null;
            try
            {
                cn = AccesoDato.dameConexion();
                cn.Open();
                SqlCommand cmd = new SqlCommand();
                string sql = "select * from Horario where IdHorario = @idHorario";
                cmd.Parameters.Add(new SqlParameter("@idHorario", idHorario));
                cmd.CommandText = sql;
                cmd.Connection = cn;
                SqlDataReader dr = cmd.ExecuteReader();
                if (dr.Read())
                {
                    horario.IdHorario = int.Parse(dr["IdHorario"].ToString());
                    horario.HoraInicio = TimeSpan.Parse(dr["HoraInicio"].ToString());
                    horario.HoraFin = (TimeSpan)dr["HoraFin"];
                    horario.Dia = dr["Dia"].ToString(); 
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw new Exception("No se pudo obtener los datos de ese Horario");//El metodo que lo invoque debera tratar la exepcion
            }
            finally//Si la conexion se pudo abrir hay que cerrarla
            {
                if (cn.State == ConnectionState.Open)
                    cn.Close();
            }
            return horario;
        }//Fin del metodo obtenerHorarioXId...
        public static void guardarCursoHorario(Curso curso, List<Horario> listaHorario)
        {
            SqlConnection cn = null;
            SqlTransaction trans = null;
            try
            {
                cn = AccesoDato.dameConexion();
                cn.Open();
                trans = cn.BeginTransaction();
                string sql = string.Empty;
                SqlCommand cmd = new SqlCommand();
                //Armo la sentencia y parametros para guardar el Curso
                sql = @"insert into Curso(IdNivelCurso, Nombre, Precio, NumeroAula, IdProfesor) 
                        values(@IdNivelCurso, @Nombre, @Precio, @NumeroAula, @IdProfesor)";

                cmd.Parameters.AddWithValue("@IdNivelCurso", curso.IdNivelCurso);
                cmd.Parameters.Add(new SqlParameter("@Nombre", curso.Nombre));
                cmd.Parameters.AddWithValue("@Precio", curso.Precio);
                cmd.Parameters.AddWithValue("@NumeroAula", curso.NumeroAula);
                cmd.Parameters.AddWithValue("@IdProfesor", curso.IdProfesor);
                
                cmd.Connection = cn;
                cmd.Transaction = trans;
                cmd.CommandText = sql;

                if (cmd.ExecuteNonQuery() == 0)
                    throw new Exception("No se pudo guardar el Curso...");

                //Recupero el IdCurso, una vez guardado el examen
                //sql = "SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]";//Lo probe sqlserver funciona
                sql = @"SELECT @@IDENTITY AS 'IDENTIDAD'";
                SqlCommand cmd1 = new SqlCommand(sql, cn, trans);
                int idCurso = int.Parse(cmd1.ExecuteScalar().ToString());

                //Si se pudo guardar el Curso comienzo a guardar los HorarioXCurso
                //Se limpia los parametros de la otra setencia
                cmd.Parameters.Clear();
                //Se arma la otra setencia sql
                sql = @"insert into HorarioXCurso(IdCurso, IdHorario) 
                        values(@IdCurso, @IdHorario)";
                cmd.CommandText = sql;
                //Por cada elemento de la lista agrego los parametros y ejecuto el command
                foreach (Horario hora in listaHorario)
                {
                    cmd.Parameters.AddWithValue("@IdCurso", idCurso);
                    cmd.Parameters.Add(new SqlParameter("@IdHorario", hora.IdHorario));
                    
                    cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear();
                }
                //Si todo se guardo bien lanzo el commit
                trans.Commit();
            }
            catch (Exception ex)
            {
                if (trans != null)
                    trans.Rollback();
                throw;
            }
            finally
            {
                if (cn.State == ConnectionState.Open)
                    cn.Close();
            }
        }//Fin del metodo guardarCursoHorario...
        public static List<CursoConsulta> obtenerCursoConsulta(string orden, int? idCurso, string nomProfesor, string apeProfesor)
        {
            List<CursoConsulta> listaCurso = new List<CursoConsulta>();
            SqlConnection cn = null;
            try
            {
                cn = AccesoDato.dameConexion();
                cn.Open();
                SqlCommand cmd = new SqlCommand();

                string sql = @"select C.IdCurso, C.Nombre, C.Precio, NC.Nivel, P.Nombre as NombreProfesor, P.Apellido as ApellidoProfesor from Curso C, Profesor P, NivelCurso NC 
                                where C.IdProfesor = P.IdProfesor and C.IdNivelCurso = NC.IdNivelCurso ";
                if (idCurso.HasValue)
                {
                    sql += " and C.IdCurso = @idCurso ";
                    cmd.Parameters.Add(new SqlParameter("@idCurso", idCurso));
                }
                if (!string.IsNullOrEmpty(nomProfesor))
                {
                    sql += " and P.Nombre like @nomProfesor ";
                    cmd.Parameters.Add(new SqlParameter("@nomProfesor", '%' + nomProfesor + '%'));
                }
                if (!string.IsNullOrEmpty(apeProfesor))
                {
                    sql += " and P.Apellido like @apeProfesor ";
                    cmd.Parameters.Add(new SqlParameter("@apeProfesor", '%' + apeProfesor + '%'));
                }               
                sql += " order by " + orden;

                cmd.CommandText = sql;
                cmd.Connection = cn;
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    CursoConsulta curso = new CursoConsulta();
                    curso.IdCurso = int.Parse(dr["IdCurso"].ToString());
                    curso.Nombre = dr["Nombre"].ToString();
                    curso.Precio = decimal.Parse(dr["Precio"].ToString());
                    curso.Nivel = dr["Nivel"].ToString();
                    curso.NombreProfesor = dr["NombreProfesor"].ToString();
                    curso.ApellidoProfesor = dr["ApellidoProfesor"].ToString();
                    listaCurso.Add(curso);
                    curso = null;
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw new Exception("No se pudieron obtener los datos...");
            }
            finally
            {
                if (cn.State == ConnectionState.Open)
                    cn.Close();
            }


            return listaCurso;
        }//Fin del metodo obtenerCursoConsulta...
        public static List<HorarioXCursoConsulta> obtenerHorarioXCurso(int idCurso)
        {
            List<HorarioXCursoConsulta> listaHorarioCurso = new List<HorarioXCursoConsulta>();
            SqlConnection cn = null;
            try
            {
                cn = AccesoDato.dameConexion();
                cn.Open();
                SqlCommand cmd = new SqlCommand();

                string sql = @"select C.Nombre, H.HoraInicio, H.HoraFin, H.Dia from Curso C, Horario H, HorarioXCurso HC 
                                where HC.IdCurso = @idCurso and HC.IdCurso = C.IdCurso and HC.IdHorario = H.IdHorario ";
                cmd.Parameters.Add(new SqlParameter("@idCurso", idCurso));
                
                cmd.CommandText = sql;
                cmd.Connection = cn;
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    HorarioXCursoConsulta horarioCurso = new HorarioXCursoConsulta();
                    horarioCurso.Nombre = dr["Nombre"].ToString();
                    horarioCurso.HoraInicio = TimeSpan.Parse(dr["HoraInicio"].ToString());
                    horarioCurso.HoraFin = TimeSpan.Parse(dr["HoraFin"].ToString());
                    horarioCurso.Dia = dr["Dia"].ToString();
                    listaHorarioCurso.Add(horarioCurso);
                    horarioCurso = null;
                }
                dr.Close();
            }
            catch (Exception ex)
            {
                throw new Exception("No se pudieron obtener los datos...");
            }
            finally
            {
                if (cn.State == ConnectionState.Open)
                    cn.Close();
            }


            return listaHorarioCurso;
        }//Fin del metodo obtenerHorarioXCurso...
    }
}
